#include<bits/stdc++.h>
using namespace std;

int n,m;
bool exist[1001];
//vector<int> edges[1001];
bool edges[1001][1001];
//set<int> edges[1001];
int in[1001];

int main(){
	cin>>n>>m;
	memset(exist,false,sizeof(exist));
	memset(in,0,sizeof(in));
	memset(edges,false,sizeof(edges));
	
	vector<int> vec,stop;
	for(int i=0;i<m;i++){
		int num,pre,cur;
		cin>>num;
		vec.clear();stop.clear();
		for(int j=0;j<num;j++){
			pre=cur;
			cin>>cur;
			exist[cur]=true;
			stop.emplace_back(cur);
			if(j==0) continue;
			for(int k=pre+1;k<cur;k++){
				vec.emplace_back(k);
				exist[k]=true;
			}
		}
		for(auto& u:vec){
			for(auto& v:stop){
				//edges[u].emplace_back(v);
				//edges[u].insert(v);
				if(!edges[u][v]) in[v]++;
				edges[u][v]=true;
			}
		};
	}
	//
	queue<int> que;
	for(int i=1;i<=n;i++){
		if(in[i]==0&&exist[i]){
			que.push(i);
		}
	}
	int ans=0;
	while(!que.empty()){
		ans++;
		int size=que.size();
		for(int j=0;j<size;j++){
			int x=que.front();
			que.pop();
			for(int u=1;u<=n;u++){
				if(edges[x][u]){
					in[u]--;
					if(in[u]==0) que.push(u);
				}
			}
//			for(auto u:edges[x]){
//				in[u]--;
//				if(in[u]==0) que.push(u);
//			}
		};
	}
	cout<<ans;
	return 0;
}
